home *** CD-ROM | disk | FTP | other *** search
- /*
- * fixer.c - Steve Hawley 3/90
- * sdh@flash.bellcore.com
- * fixer will patch PICT files created by Giffer 1.03 so that they can
- * be displayed in Studio 8, or Image etc.
- *
- * The problem with giffer is that it redefines white and black (positions 0 and
- * 255 in the colormap). This is a bad thing to do, and confuses the heck out of
- * the poor Macintosh.
- *
- * Fixer takes a stupid, but quick means at patching the files. It copies the
- * file, coercing color 0 to be white and color 255 to be black. It doesn't parse
- * the PICT file, so it won't work on anything but those created by Giffer 1.03.
- * ie, I've only tested it on 1.03 --it might work on other versions, but don't
- * hold your breath.
- */
-
-
-
- main()
- {
- int inRef, outRef;
-
- InitGraf(&thePort);
- InitFonts();
- InitWindows();
- TEInit();
- InitMenus();
- InitDialogs(0L);
- SetCursor(&arrow);
-
- while((inRef = PickLoad()) != -1) {
- if ((outRef = PickSave()) != -1) {
- Thrash(inRef, outRef);
- FSClose(inRef);
- FSClose(outRef);
- }
- }
- }
-
- PickLoad()
- {
- static Point p = { 100, 100 };
- SFReply myReply;
- static OSType myTypes[] = {
- 'PICT'
- };
- int fRef;
-
- SFGetFile(p, "\PWhich file?", 0L, sizeof(myTypes)/sizeof(OSType), myTypes,
- 0L, &myReply);
- if (myReply.good) {
- if (FSOpen(myReply.fName, myReply.vRefNum, &fRef)) return(-1);
- else return(fRef);
- }
- return(-1);
- }
-
- PickSave()
- {
- static Point p = { 100, 100 };
- int fRef;
- SFReply myReply;
-
- myReply.fType = 'PICT';
- SFPutFile(p, "\PSave as:", "\p", 0L, &myReply);
- if (myReply.good) {
- Create(myReply.fName, myReply.vRefNum, '????', 'PICT');
- if (FSOpen(myReply.fName, myReply.vRefNum, &fRef)) return(-1);
- else return(fRef);
- }
- else return(-1);
- }
-
- Thrash(from, to)
- int from, to;
- {
- Ptr data;
- long size, fileEOF, currMark, dataSize;
- register int i;
- register unsigned char *p;
- struct {
- unsigned int r, g, b;
- } rgb;
-
- size = 624; /* 624 is the offset until 1st entry in colormap */
- data = NewPtr(size);
- FSRead(from, &size, data);
-
- size = 624;
- FSWrite(to, &size, data);
-
- DisposPtr(data);
-
- size = sizeof(rgb);
- FSRead(from, &size, &rgb);
- rgb.r = 0xffff; /* force white */
- rgb.g = 0xffff;
- rgb.b = 0xffff;
- size = sizeof(rgb);
- FSWrite(to, &size, &rgb);
-
- size = 2034; /* offset to last entry in rgb table */
- data = NewPtr(size);
- FSRead(from, &size, data);
-
- size = 2034;
- FSWrite(to, &size, data);
- DisposPtr(data);
-
- size = sizeof(rgb);
- FSRead(from, &size, &rgb);
- rgb.r = 0; /* force black */
- rgb.g = 0;
- rgb.b = 0;
- size = sizeof(rgb);
- FSWrite(to, &size, &rgb);
-
- size = 18; /* offset to data start */
- data = NewPtr(size);
- FSRead(from, &size, data);
-
- size = 18;
- FSWrite(to, &size, data);
- DisposPtr(data);
-
- GetFPos(from, &currMark);
- GetEOF(from, &fileEOF);
-
- data = NewPtr(16384L); /* nice big buffer */
- do {
- size = 16384;
- FSRead(from, &size, data);
- FSWrite(to, &size, data);
- } while(size); /* copy until EOF */
- DisposPtr(data);
- }